package main

import (
	"context"                // 提供上下文功能，用于控制gRPC调用的生命周期（如超时、取消）
	"errors"                 // 用于创建自定义错误信息
	"google.golang.org/grpc" // gRPC核心库，提供服务端创建、服务注册等基础能力
	"log"                    // 用于日志输出，记录程序运行状态和错误
	"net"                    // 提供网络监听功能，用于创建TCP连接监听器

	"3-6/proto/user" // 导入由protobuf生成的用户服务相关代码（包含服务接口、请求/响应结构等）
)

// UserServer 是gRPC服务的实现结构体
// 该结构体需要实现user.UserServer接口（由protobuf自动生成）中定义的所有方法
type UserServer struct{}

// GetUser 实现gRPC服务接口中的GetUser方法，处理客户端的用户查询请求
// 参数：
//
//	ctx context.Context：上下文对象，可用于获取请求元数据、设置超时等
//	req *user.GetUserReq：客户端发送的请求对象，包含要查询的用户ID
//
// 返回值：
//
//	*user.GetUserResp：查询成功时返回的用户信息响应对象
//	error：查询失败时返回的错误信息（如用户不存在）
func (u *UserServer) GetUser(_ context.Context, req *user.GetUserReq) (*user.GetUserResp, error) {
	// 根据请求中的用户ID从模拟数据库中查询用户
	if u, ok := users[req.Id]; ok {
		// 若用户存在，返回包含用户信息的响应对象
		return &user.GetUserResp{
			Id:    u.Id,
			Name:  u.Name,
			Phone: u.Phone,
		}, nil
	}

	// 若用户不存在，返回错误信息
	return nil, errors.New("不存在查询用户")
}

func main() {
	// 创建TCP监听器，监听本地1234端口（与客户端连接的端口需一致）
	listen, err := net.Listen("tcp", ":1234")
	if err != nil {
		// 监听失败时输出日志并终止程序（如端口被占用、无权限等）
		log.Fatal("监听失败", err)
	}
	// 创建gRPC服务器实例（可通过参数配置拦截器、TLS等高级功能）
	s := grpc.NewServer()

	// 将UserServer实例注册到gRPC服务器，使其能处理用户服务相关的请求
	user.RegisterUserServer(s, new(UserServer))

	// 输出服务启动日志
	log.Println("服务已启动")

	// 启动gRPC服务器，开始监听并处理客户端请求（该方法会阻塞当前协程）
	err = s.Serve(listen)
	if err != nil {
		return
	}
}
